home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / chess.src < prev    next >
Text File  |  1992-01-11  |  14KB  |  483 lines

  1. %%HP: T(3)A(D)F(.);
  2. @ CHESS by Paul Dale
  3. DIR
  4.   play
  5.     \<< RCLF 'FLGS' STO
  6.       STBRD OBJ\->  'BRD' STO
  7.       "2'DPTH'0'PLY'0'MTBL'0'EPSNT'0'SCORE'25'PKNG'95'CKNG'1 7" OBJ\->
  8.       START STO
  9.       NEXT { # 400306410103F4h # 0h } STOF
  10.       # 83h # 40h BLANK PICT STO
  11.       { # 0h # 0h } PVIEW DRWB
  12.       DO "____" 'INP' STO
  13.         2 SF
  14.         FINP MOVE
  15.         MEM DROP
  16.       UNTIL 1 FS?
  17.       END FLGS STOF
  18.       "{FLGS DPTH PLY BRD INP MTBL SCORE PKNG CKNG EPSNT}" OBJ\-> PURGE
  19.     \>>
  20.   DISPMV
  21.     \<< C\->R \-> frs tos
  22.       \<< PICT frs COORDS C\->R SWAP R\->C 8 * (7,7) - # 8h # 8h BLANK
  23.         IF frs DUP 10 / IP + 2 MOD
  24.         THEN NEG
  25.         END REPL tos BDGT DUP ABS SWAP SIGN \-> p col
  26.         \<< PICT tos COORDS C\->R SWAP R\->C 8 * (7,7) - DUP2 # 8h # 8h BLANK
  27.           IF tos DUP 10 / IP + 2 MOD
  28.           THEN NEG
  29.           END REPL
  30.           IF tos DUP 10 / IP + 2 MOD DUP col -1 SAME XOR
  31.           THEN 2
  32.           ELSE 1
  33.           END FIG SWAP GET p GET SWAP
  34.           \<< GXOR
  35.           \>>
  36.           \<< GOR
  37.           \>> IFTE
  38.         \>>
  39.       \>> DROP
  40.     \>>
  41.   FIG { {
  42. GROB 8 8 0000C3424242C300
  43. GROB 8 8 00C366242764C700
  44. GROB 8 8 00C143426624E700
  45. GROB 8 8 00E7A5242424E700
  46. GROB 8 8 00E7A5662424E700
  47. GROB 8 8 00C366246624E700
  48. } {
  49. GROB 8 8 0000008181810000
  50. GROB 8 8 000081C3C0830000
  51. GROB 8 8 0000808181C30000
  52. GROB 8 8 000042C3C3C30000
  53. GROB 8 8 00004281C3C30000
  54. GROB 8 8 000081C381C30000
  55. } }
  56.   debugs
  57.     \<< \-> n
  58.       \<< DUP C\->R UNCVT SWAP UNCVT SWAP + PLY
  59.        \->STR " " + n \->STR + " " + SWAP + " " + 5 DIS
  60.       \>>
  61.     \>>
  62.   SORTMV
  63.     \<< \-> xt sq
  64.       \<< { } 1 22
  65.         START DUP
  66.         NEXT 21 \->LIST DUP \-> xht sht
  67.         \<< 1 xt SIZE
  68.           FOR n xht xt n GET DUP C\->R DROP
  69.             IF DUP 18 >
  70.             THEN DROP 18
  71.             END 1 + DUP xht SWAP GET ROT + OVER sht SWAP DUP2
  72.             GET sq n GET + PUT 'sht' STO PUT 'xht' STO
  73.           NEXT 'xt' STO 'sq' STO
  74.           "6 16 9 13 8 14 7 15 2 20 3 1 1 12" STR\->
  75.           START xt xht 3 PICK GET + 'xt' STO sq sht ROT GET + 'sq' STO
  76.           NEXT xt sq
  77.         \>>
  78.       \>>
  79.     \>>
  80.   SEARCH
  81.     \<< MEM DROP 1 'PLY' STO+ \-> l1 col
  82.       \<< MAXR col * { i i } \-> l2 best
  83.         \<< col ALLMV SORTMV DUP SIZE
  84.           IF col 0 >
  85.           THEN
  86.             \<< \>= \>>
  87.             \<< < \>>
  88.           ELSE
  89.             \<< \<= \>>
  90.             \<< > \>>
  91.           END \-> xt sq n c1 c2
  92.           \<<
  93.             DO xt n GET sq n GET DUP2 MKMV n debugs DUP C\->R SWAP DROP DUP
  94.               MVGEN DROP SIZE 200 / SWAP COORDS DUP (4.5,4.5) - ABS 10 * INV
  95.               RD2 SWAP col 0 > CKNG PKNG IFTE COORDS - ABS 10 * 1 + INV RD2
  96.               + + col * DUP NEG SCUPD ROT ROT 12 col * col SCOREMV
  97.               IF 1
  98.               THEN DUP \->STR "  " + 6 DIS
  99.               END
  100.               IF DUP l1 c1 EVAL
  101.               THEN 8 CF
  102.                 IF DUP l2 c2 EVAL
  103.                 THEN 'l2' STO DUP2
  104.                   IF PLY 1 SAME
  105.                   THEN DUP2 SHOWMV
  106.                   END 2 \->LIST 'best' STO
  107.                 ELSE DROP
  108.                 END
  109.               ELSE 'l2' STO 8 SF
  110.               END n 1 - DUP 'n' STO
  111.               IF NOT
  112.               THEN 8 SF
  113.               END UNMKMV SCUPD
  114.             UNTIL 8 FS?
  115.             END
  116.           \>> best LIST\-> DROP l2
  117.         \>>
  118.       \>> 'PLY' 1 STO-
  119.     \>>
  120.   SCOREMV
  121.     \<<
  122.       IF PLY DPTH ==
  123.       THEN DROP2 SCORE
  124.       ELSE NEG SEARCH ROT ROT DROP2
  125.       END
  126.     \>>
  127.   GETMV
  128.     \<< \-> n
  129.       \<< n GET SWAP n GET SWAP \>>
  130.     \>>
  131.   CPMV
  132.     \<< MAXR -1
  133.       IF 5 FS?
  134.       THEN NEG SWAP NEG SWAP
  135.       END SEARCH DROP "My move" 3 DIS DUP2 SHOWMV DUP2 MKMV DISPMV ERRBELL
  136.     \>>
  137.   UNMKMV
  138.     \<< \-> xt sq
  139.       \<< sq C\->R xt C\->R \-> frs tos t z
  140.         \<< 'BRD' DUP tos BDGT DUP SIGN \-> col
  141.           \<< frs SWAP PUT tos 0 PUT
  142.             IF tos PKNG SAME
  143.             THEN frs 'PKNG' STO
  144.             ELSE
  145.               IF tos CKNG SAME
  146.               THEN frs 'CKNG' STO
  147.               END
  148.             END
  149.             IF xt i \=/
  150.             THEN
  151.               IF t 1 SAME
  152.               THEN z GTML NEG MTUPD 'BRD' tos z PUT
  153.               ELSE
  154.                 IF t 2 SAME
  155.                 THEN z 'EPSNT' STO
  156.                 ELSE
  157.                   IF t NOT
  158.                   THEN 'BRD' tos 10 col * - col NEG PUT col GTML MTUPD
  159.                   ELSE
  160.                     IF t 20 >
  161.                     THEN 'BRD' DUP t z BDGT PUT z 0 PUT
  162.                     ELSE 'BRD' DUP frs col PUT tos t 10 - DUP GTML z GTML
  163.                     - col GTML - MTUPD PUT
  164.                     END
  165.                   END
  166.                 END
  167.               END
  168.             END
  169.           \>>
  170.         \>>
  171.       \>>
  172.     \>>
  173.   GTML
  174.     \<< DUP SIGN SWAP ABS \-> col pce
  175.       \<< [ 1 3.25 3.5 5 9 120 ] pce
  176.         IFERR GET
  177.         THEN DROP2 0
  178.         ELSE col *
  179.         END
  180.       \>>
  181.     \>>
  182.   SCUPD
  183.     \<< 'SCORE' STO+ \>>
  184.   MTUPD
  185.     \<< DUP 'MTBL' STO+ SCUPD \>>
  186.   MKMV
  187.     \<< \-> xt sq
  188.       \<< sq C\->R xt C\->R \-> frs tos t z
  189.         \<<
  190.           IF frs PKNG SAME
  191.           THEN tos 'PKNG' STO
  192.           ELSE
  193.             IF frs CKNG SAME
  194.             THEN tos 'CKNG' STO
  195.             END
  196.           END 'BRD' DUP frs BDGT DUP DUP SIGN SWAP ABS \-> col ptyp
  197.           \<< tos SWAP PUT frs 0 DUP 'EPSNT' STO PUT
  198.             IF xt i \=/
  199.             THEN
  200.               IF t 1 SAME
  201.               THEN z GTML MTUPD
  202.               ELSE
  203.                 IF t 2 SAME
  204.                 THEN frs 10 col * + 'EPSNT' STO
  205.                 ELSE
  206.                   IF t NOT
  207.                   THEN 'BRD' tos 10 col * - 0 PUT col NEG GTML MTUPD
  208.                   ELSE
  209.                     IF t 20 >
  210.                     THEN 'BRD' DUP z t BDGT PUT t 0 PUT
  211.                     ELSE z GTML MTUPD 'BRD' tos t 10 - DUP GTML col GTML
  212.                       SWAP - MTUPD PUT
  213.                     END
  214.                   END
  215.                 END
  216.               END
  217.             END
  218.           \>>
  219.         \>>
  220.       \>>
  221.     \>>
  222.   CVRTSQ
  223.     \<< DUP 1 DUP SUB "abcdefgh" SWAP POS SWAP 2 DUP SUB
  224.      "12345678" SWAP POS \-> x y
  225.       \<<
  226.         IF x NOT y NOT OR
  227.         THEN 4 SF
  228.         ELSE x 10 DUP y * + +
  229.         END
  230.       \>>
  231.     \>>
  232.   PLMV
  233.     \<< 4 CF INP CVRTSQ INP 3 4 SUB CVRTSQ \-> frs tos
  234.       \<<
  235.         IF 4 FC? frs BDGT DUP 0 > SWAP 7 \=/ AND AND
  236.         THEN frs MVGEN frs tos R\->C POS DUP
  237.           IF 0 SAME
  238.           THEN DROP
  239.           ELSE GET frs tos R\->C DUP2 MKMV DISPMV 6 SF
  240.           END
  241.         END
  242.       \>>
  243.     \>>
  244.   ALLMV
  245.     \<< { } DUP \-> col sq xt
  246.       \<< 21 98
  247.         FOR n
  248.           IF n BDGT DUP SIGN col SAME SWAP 7 \=/ AND
  249.           THEN n MVGEN sq + 'sq' STO xt + 'xt' STO
  250.           END
  251.         NEXT xt sq
  252.       \>>
  253.     \>>
  254.   MVGEN
  255.     \<< 3 CF { } DUP \-> p sq xt
  256.       \<< p BDGT DUP SIGN SWAP ABS
  257.         \<< xt + 'xt' STO p SWAP R\->C sq + 'sq' STO
  258.         \>> \-> col pce admov
  259.         \<<
  260.           \<< p + DUP BDGT DUP DUP DUP
  261.             IF
  262.             THEN 3 SF
  263.             END
  264.             IF 7 \=/ SWAP SIGN col \=/ AND
  265.             THEN
  266.               IF DUP NOT
  267.               THEN DROP i
  268.               ELSE 1 SWAP R\->C
  269.               END admov EVAL
  270.             ELSE DROP2
  271.             END
  272.           \>> \-> chk
  273.           \<<
  274.             \<< STR\->
  275.               START 0
  276.                 DO OVER + DUP chk EVAL
  277.                 UNTIL 3 FS?C
  278.                 END DROP2
  279.               NEXT
  280.             \>> \-> mmv
  281.             \<< {
  282.               \<<
  283.                 \<< \-> tos
  284.                   \<<
  285.                     IF tos 10 / IP DUP 2 SAME SWAP 9 SAME OR
  286.                     THEN 2 5
  287.                       FOR m tos DUP BDGT m col * 10 + SWAP R\->C admov EVAL
  288.                       NEXT 0
  289.                     ELSE tos 1
  290.                     END
  291.                   \>>
  292.                 \>> \-> promote
  293.                 \<<
  294.                   \<< DUP
  295.                     IF DUP EPSNT SAME
  296.                     THEN i NEG admov EVAL DROP
  297.                     ELSE
  298.                       IF BDGT DUP DUP 7 \=/ SWAP SIGN col + NOT AND
  299.                       THEN SWAP
  300.                         IF promote EVAL
  301.                         THEN 1 ROT R\->C admov EVAL
  302.                         ELSE DROP
  303.                         END
  304.                       ELSE DROP2
  305.                       END
  306.                     END
  307.                   \>> \-> capchk
  308.                   \<< 10 col * p + DUP DUP
  309.                     IF BDGT
  310.                     THEN DROP
  311.                     ELSE
  312.                       IF promote EVAL
  313.                       THEN i admov EVAL
  314.                       ELSE DROP
  315.                       END
  316.                       IF p 10 / IP DUP 3 SAME SWAP 8 SAME OR
  317.                       THEN 20 col * p + DUP
  318.                         IF BDGT
  319.                         THEN DROP
  320.                         ELSE 2 EPSNT R\->C admov EVAL
  321.                         END
  322.                       END
  323.                     END 1 DUP2 + capchk EVAL - capchk EVAL
  324.                   \>>
  325.                 \>>
  326.               \>>
  327.               \<<
  328.                 "8 -8 12 -12 19 -19 21 -21 1 8" STR\->
  329.                 START chk EVAL
  330.                 NEXT
  331.               \>>
  332.               \<< "9 -9 11 -11 1 4" mmv EVAL \>>
  333.               \<< "1 -1 10 -10 1 4" mmv EVAL \>>
  334.               \<< "1 -1 9 -9 10 -10 11 -11 1 8" mmv EVAL \>>
  335.               \<<
  336.                 "1 -1 9 -9 10 -10 11 -11 1 8" STR\->
  337.                 START chk EVAL
  338.                 NEXT
  339.                 IF p 25 SAME p 95 SAME OR
  340.                 THEN
  341.                   IF p 1 + BDGT NOT
  342.                     p 2 + BDGT NOT AND
  343.                     p 3 + BDGT ABS 4 SAME AND
  344.                   THEN p 2 + p 3 + p 1 + R\->C admov EVAL
  345.                   END
  346.                   IF p 1 - BDGT NOT
  347.                     p 2 - BDGT NOT AND
  348.                     p 3 - BDGT NOT AND
  349.                     p 4 - BDGT ABS 4 SAME AND
  350.                   THEN p 2 - p 4 - p 1 - R\->C admov EVAL
  351.                   END
  352.                 END
  353.               \>> } pce GET EVAL
  354.             \>>
  355.           \>>
  356.         \>> xt sq
  357.       \>>
  358.     \>>
  359.   SHOWMV
  360.     \<< C\->R UNCVT SWAP UNCVT SWAP + 4 DIS DROP \>>
  361.   UNCVT
  362.     \<< 10 / DUP IP 1 - \->STR SWAP FP 10 * "abcdefgh" SWAP DUP SUB SWAP +
  363.     \>>
  364.   COORDS
  365.     \<< 10 / DUP IP 1 - SWAP FP 10 * R\->C \>>
  366.   RD2
  367.     \<< 100 * IP 100 / \>>
  368.   BDGT
  369.     \<< 'BRD' SWAP GET \>>
  370.   DRWB
  371.     \<< 21 \-> n
  372.       \<< (1,1)
  373.         WHILE 99 n \>=
  374.         REPEAT n
  375.           IF 5 FS?
  376.           THEN 119 SWAP -
  377.           END BDGT DUP ABS SWAP SIGN \-> p col
  378.           \<<
  379.             IF p 7 \=/
  380.             THEN DUP PICT SWAP # 8h # 8h BLANK
  381.               IF n DUP 10 / IP + 2 MOD
  382.               THEN NEG
  383.               END REPL
  384.             END
  385.             IF p 0 \=/
  386.             THEN
  387.               IF p 7 SAME
  388.               THEN (-40,4) +
  389.               ELSE DUP
  390.                 IF n DUP 10 / IP + 2 MOD DUP col -1 SAME XOR
  391.                 THEN 2
  392.                 ELSE 1
  393.                 END FIG SWAP GET p GET PICT 4 ROLLD SWAP
  394.                 \<< GXOR \>>
  395.                 \<< GOR \>> IFTE
  396.               END
  397.             END
  398.           \>> (8,0) + n 1 + 'n' STO
  399.         END DROP
  400.       \>>
  401.     \>>
  402.   MOVE
  403.     \<< 6 CF "        " 3 DIS "    " 4 DIS
  404.       IF INP "quit" ==
  405.       THEN 1 SF
  406.       ELSE
  407.         IF INP "halt" ==
  408.         THEN HALT
  409.         ELSE
  410.           IF INP "swap" ==
  411.           THEN
  412.             IF 5 DUP FS?
  413.             THEN CF
  414.             ELSE SF
  415.             END 6 SF 119 PKNG - 119 CKNG - 'PKNG' STO 'CKNG' STO DRWB
  416.           ELSE PLMV
  417.           END
  418.           IF 6 FS?
  419.           THEN CPMV
  420.           ELSE "Illegal move" 6 DIS ERRBELL
  421.           END
  422.         END
  423.       END
  424.     \>>
  425.   DIS
  426.     \<< 1 - 10 * SWAP 2 \->GROB
  427.       SWAP 57 SWAP - -66 SWAP R\->C SWAP PICT 3 ROLLD REPL
  428.     \>>
  429.   input
  430.     \<<
  431.       WHILE key
  432.       REPEAT \-> st
  433.         \<<
  434.           IF st SIZE 1 SAME
  435.           THEN INP 2 4 SUB st + 'INP' STO
  436.           ELSE
  437.             IF st "ENTER" SAME
  438.             THEN 2 CF
  439.             ELSE
  440.               IF st "DEL" SAME
  441.               THEN "____" 'INP' STO
  442.               ELSE
  443.                 IF st "BACK" SAME
  444.                 THEN "_" INP 1 3 SUB + 'INP' STO
  445.                 END
  446.               END
  447.             END
  448.           END INP 2 DIS
  449.         \>>
  450.       END
  451.     \>>
  452.   FINP
  453.     \<< 2 SF "Your move?" 1 DIS INP 2 DIS
  454.       WHILE 2 FS?
  455.       REPEAT input
  456.       END "          " 1 DIS
  457.     \>>
  458.   ERRBELL
  459.     \<< 440 .1 BEEP \>>
  460.   STBRD
  461. "[7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4 2 3 5 6 3 2 4 7 7 1 1 1 1 1 1 1 1 7 7 0 0 0 0 0 0 0 0 7 7 0 0 0 0 0 0 0 0 7 7 0 0 0 0 0 0 0 0 7 7 0 0 0 0 0 0 0 0 7 7 -1 -1 -1 -1 -1 -1 -1 -1 7 7 -4 -2 -3 -5 -6 -3 -2 -4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7"
  462.   key
  463.     \<< { { "a" "b" "c" "d" "e" "f" }
  464.           { "g" "h" "i" "j" "k" "l" }
  465.           { "m" "n" "o" "p" "q" "r" }
  466.           { "s" "t" "u" "v" "w" "x" }
  467.           { "ENTER" "y" "z" "DEL" "BACK" }
  468.           { "" "7" "8" "9" "" }
  469.           { "" "4" "5" "6" "" }
  470.           { "" "1" "2" "3" "-" }
  471.           { "" "0" "." " " "+" } } KEY
  472.       \<< 10 / DUP IP SWAP FP 10 * 3 ROLLD GET SWAP GET
  473.         IF DUP SIZE
  474.         THEN 1
  475.         ELSE DROP 0
  476.         END
  477.       \>>
  478.       \<< DROP 0
  479.       \>> IFTE
  480.     \>>
  481.   PPAR { (-66,-6) (64,57) constant 1 (0,0) FUNCTION Y }
  482. END
  483.